package br.ufc.great.dataguide;

import java.io.Serializable;
import java.util.Vector;

import br.ufc.great.xml.XMLElement;

/**
 * 
 * @author Leonardo Oliveira Moreira
 *
 * Classe utilizada para representar um elemento do DataGuide
 */
public class DGElement implements Serializable  {

	private long id;
	private String name;
	private DGElement parent;
	private LockList lockList;	
	private Vector<DGElement> childrens;
	private Vector<XMLElement> indexes;
	
	public DGElement(long id, String name, DGElement parent) {
		this.id = id;
		this.name = name;
		this.parent = parent;
		lockList = new LockList();
		childrens = new Vector<DGElement>();
		indexes = new Vector<XMLElement>();
	}

	/**
	 * M�todo utilizado para adicionar um �ndice no elemento
	 * 
	 * @param target
	 */
	public void addIndex(XMLElement target) {
		boolean exists = false;
		for (int i = 0; i < indexes.size(); i++) {
			XMLElement item = indexes.elementAt(i);
			if (item.getId() == target.getId()) {
				exists = true;
				break;
			}
		}
		if (! exists)
			indexes.add(target);
	}
	
	/**
	 * M�todo utilizado para adicionar um elemento filho no elemento
	 * 
	 * @param element
	 */
	public void addChildren(DGElement element) {
		boolean exists = false;
		for (int i = 0; i < childrens.size(); i++) {
			DGElement item = childrens.elementAt(i);
			if (item.getId() == element.getId()) {
				exists = true;
				break;
			}
		}
		if (! exists)
			childrens.add(element);
	}

	/**
	 * M�todo utilizado para resgatar o identificador do elemento
	 * 
	 * @return
	 */
	public long getId() {
		return id;
	}
	
	/**
	 * M�todo utilizado para verificar se o elemento � uma folha
	 * 
	 * @return
	 */
	public boolean isLeaf() {
		return (childrens.size() == 0);
	}

	/**
	 * M�todo utilizado para resgatar os filhos do elemento
	 * 
	 * @return
	 */
	public Vector<DGElement> getChildrens() {
		return childrens;
	}

	/**
	 * M�todo utilizado para resgatar os �ndices do elemento
	 * 
	 * @return
	 */
	public Vector<XMLElement> getIndexes() {
		return indexes;
	}

	/**
	 * M�todo utilizado para resgatar a lista de bloqueios do elemento 
	 * 
	 * @return
	 */
	public LockList getLockList() {
		return lockList;
	}

	/**
	 * M�todo utilizado para resgatar o nome do elemento
	 * 
	 * @return
	 */
	public String getName() {
		return name;
	}

	/**
	 * M�todo utilizado para resgatar o elemento ascendente, retorna nulo caso o elemento seja raiz
	 * 
	 * @return
	 */
	public DGElement getParent() {
		return parent;
	}
	
	/**
	 * Método utilizado para verificar se o elemento é raiz
	 * 
	 * @return
	 */
	public boolean isRoot() {
		return (parent == null);
	}

}
